package com.jsdsft.openapi.controller;

import com.alibaba.fastjson2.JSONObject;
import com.jsdsft.openapi.rest.JsdSftRestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 交易收单相关接口
 *
 * @author xm
 * @date 2025/1/14
 **/
@RestController
@RequestMapping("transfer_order")
public class TransferOrderController {

    @Autowired
    private JsdSftRestUtil jsdSftRestUtil;
    private final static String version = "/v1";

    @Value("${jsd_sft.mc_no}")
    public String mc_no;
    @Value("${jsd_sft.transfer_callback}")
    public String transfer_callback;
    @GetMapping("create")
    public Object create() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("amount", "0.3");
        requestMap.put("orderTitle", "");
        requestMap.put("appId", "");
        requestMap.put("openId", "");
        requestMap.put("name", "");
        requestMap.put("xjyxHdmc", "");
        requestMap.put("xjyxJlsm", "");
        requestMap.put("notifyUrl", transfer_callback);
        try {
            JSONObject jsonObject = jsdSftRestUtil.post(requestMap, version + "/transfer_order/create");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    @GetMapping("cancel")
    public Object cancel() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("tradeNo", "TO2025072190354000005");
        try {
            JSONObject jsonObject = jsdSftRestUtil.post(requestMap, version + "/transfer_order/cancel");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    @GetMapping("query")
    public Object query() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("tradeNo", "TO2025072190354000005");
        try {
            JSONObject jsonObject = jsdSftRestUtil.post(requestMap, version + "/transfer_order/query");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    @GetMapping("gen_bill")
    public Object gen_bill() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", "202401230000001");
        requestMap.put("tradeNo", "TO2025072190354000005");
        try {
            JSONObject jsonObject = jsdSftRestUtil.post(requestMap, version + "/transfer_order/gen_bill");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

}
